home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.whtech.com
/
ftp.whtech.com.tar
/
ftp.whtech.com
/
datasheets and manuals
/
Hardware
/
WHT
/
scsi
/
dsr_sources_2_2001
/
rmdir
< prev
next >
Wrap
Text File
|
2006-10-19
|
5KB
|
193 lines
************************************************************
* *
* GPL Subprogram >29 - Delete Subdirectory *
* *
* Date: January 12, 1996 *
* Author: David Nieters *
* *
* Description: This subroutine will delete a *
* subdirectory, but only if it is empty. *
* *
* Inputs: *
* PATH - Contains parent directory (blank if in root) *
* >834C - Unit Number *
* >834E - Pointer to directory name *
* *
* Error Codes: *
* 4 - Directory was not empty *
* 6 - Device Error *
* 7 - Directory does not exist *
* *
* Modifications: *
* March 22, 1997 - Added code to delete FDIR also when *
* deleting a directory *
* *
************************************************************
RMDIR0 ANDI R12,>FF00
AI R12,24
BL @MAKEFN
* Append a period to the name
*
LDCR @B02,4
LI R1,NCB
RMDIR1 CB *R1+,@SPACE
JNE RMDIR1
DEC R1
MOVB @PERIOD,*R1
LDCR @B04,4
MOVB @PERIOD,*R1
* See if the directory exists
*
BL @GETDDR
CI R5,0
JNE RMDIR2 Directory does not exist
MOVB @B07,@>8350 Set error code
B @DSRRT
* Directory exists - make sure it is empty
*
RMDIR2 LDCR @B03,4
C @22(R5),@ZERO
JEQ RMDIR3
MOVB @B04,@>8350 Set error code
B @DSRRT
* Directory exists and is empty - delete it
* Step 1: Remove the AU from the parent and decrement
* the number of subdirectories counter
* Step 2: Deallocate the AU formerly used by the deleted DDR
* Step 3: Deallocate the AU of the FDIR
*
RMDIR3
MOV @24(R5),R1 Get AU of FDIR
LDCR @B02,4
MOV R1,@MKDAU2 And save for later
* We should invalidate the cache entry. Something like this
* should do it -
*
LDCR @B04,4
CLR *R4
* LDCR @B04,4
MOV @SAVEAU,R1 Get AU of DDR
LDCR @B02,4
MOV R1,@SFDRAU Save for later
* Remove the last period from the file name and get the
* parent DDR
*
LDCR @B02,4
LI R1,NCB+39
RMDIR4 CB *R1,@PERIOD
JEQ RMDIR5
DEC R1
JMP RMDIR4
RMDIR5 MOVB @SPACE,*R1
LDCR @B04,4
MOVB @SPACE,*R1
BL @GETDDR
LDCR @B02,4
MOV @SFDRAU,R7
LDCR @B03,4
SB @B01,@23(R5) Decrement subdirectory counter
MOV R5,R4
AI R4,28
RMDIR6 C R7,*R4+
JNE RMDIR6
AI R5,256 Now points to end of DDR
MOV R4,R3
DECT R3
RMDIR7 MOV *R4+,*R3+
C R4,R5
JNE RMDIR7
CLR *R3
AI R5,-256
* Now write DDR back out
*
LDCR @B04,4
MOV @SAVEAU,R7 Get AU of parent DDR
MOV R6,R3
SRL R3,8
SLA R3,1
MPY @SAUTBL(R3),R7
LI R1,SECBUF
SRL R8,1
JNC RMDR7A
AI R1,>100
RMDR7A SRL R7,1
JNC RMDR7B
AI R8,>8000
RMDR7B
LDCR @ZERO,4
BLWP @BANKIT
DATA SCSIRD
JEQ RMDIR8
RMDIRE MOVB @B06,@>8350
B @DSRRT
RMDIR8
* Copy the new DDR and write it back out
*
LI R0,256
RMDR8A LDCR @B03,4
MOV *R5+,R2
LDCR @ZERO,4
MOV R2,*R1+
DECT R0
JNE RMDR8A
BLWP @BANKIT
DATA SCSIWT
JNE RMDIRE
* If we are writing out the VIB, we need to write
* out the copy as well
CI R7,0
JNE RMDIR9
CI R8,0
JNE RMDIR9
AI R8,16
BLWP @BANKIT
DATA SCSIWT
JNE RMDIRE
RMDIR9
* Now deallocate the AU. If the DDR and FDIR are adjacent, we can
* delallocate both AUs in one call. Otherwise, we have to make two
* calls to DEALL.
LDCR @B02,4
MOV @SFDRAU,R7
MOV @MKDAU2,R8
MOV R8,R1
DEC R1
C R1,R7
JEQ RMDR9A
MOV R7,R8
LDCR @ZERO,4
BLWP @DEALL
LDCR @B02,4
MOV @MKDAU2,R7
MOV R7,R8
RMDR9A LDCR @ZERO,4
BLWP @DEALL
MOVB @ZERO,@>8350 Set success code
B @DSRRT